package com.steve.summary.two_PC;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: STEVE
 * @Description: 参与者
 * @since: 2025-05-21
 */
public class Participant {

    private String id;
    private boolean prepared = false;
    private boolean committed = false;
    private Map<String, Integer> data;  // 模拟数据库（账户余额）

    public Participant(String id) {
        this.id = id;
        this.data = new HashMap<>();
        this.data.put("balance", 100);  // 初始余额100
    }

    /**
     * 准备阶段（Phase 1）
     *
     * @param txId   事务ID
     * @param amount 操作金额（正数存款，负数扣款）
     * @return true/false 表示是否准备成功
     */
    public boolean prepare(String txId, int amount) {
        try {
            // 检查业务约束（例如余额是否足够）
            if (data.get("balance") + amount >= 0) {
                prepared = true;    // 锁定资源，记录undo日志（伪代码）
                System.out.println("[Participant " + id + "] Prepared for TX " + txId);
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;   // 模拟失败（如超时、异常）
        }
    }

    /**
     * 提交阶段（Phase 2）
     */
    public boolean commit(String txId, int amount) {
        if (!prepared) {
            return false;   // 未准备成功，拒绝提交
        }
        data.put("balance", data.get("balance") + amount);  // 执行提交
        committed = true;
        System.out.println("[Participant " + id + "] Committed TX " + txId);
        return true;
    }

    /**
     * 回滚阶段（Phase 2）
     */
    public boolean rollback(String txId) {
        if (prepared && !committed) {
            prepared = false;   // 释放资源（伪代码）
            System.out.println("[Participant " + id + "] Rolled back TX " + txId);
            return true;
        }
        return false;
    }

    public int getBalance() {
        return data.get("balance");
    }

}
